/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import transferencia.DisciplinaTO;
import transferencia.CadeiaTO;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;

/**
 *
 * @author lljotall
 */
public class CadeiaBO {
    
    public static CadeiaTO criaArvore(DisciplinaTO raiz){
        CadeiaTO cadeia = new CadeiaTO(raiz);
        
        criaArvoreRecursivamente(cadeia, raiz);
        
        return cadeia;
    }
    
    public static CadeiaTO criaArvore(String raizSigla){
        return criaArvore(DisciplinaBO.getDisciplinaSigla(raizSigla));
    }
    //TODO testar
    private static void criaArvoreRecursivamente(CadeiaTO cadeia, DisciplinaTO d){
        List<String> preReqs = d.getPreRequisitos();
        
        cadeia.adicionaDisciplina(d);
        
        if(preReqs != null)
            for(String preReq: preReqs){
                DisciplinaTO pr = DisciplinaBO.getDisciplinaSigla(preReq);
                criaArvoreRecursivamente(cadeia, pr);
            }
    }
    
    public static List<CadeiaTO> getCadeiasCriticas(DefaultListModel lista){
        List<CadeiaTO> cadeia = new ArrayList<CadeiaTO>();
        List<CadeiaTO> cadeiasCriticas = new ArrayList<CadeiaTO>();
        
        /*Cria uma lista de arvores a partir das disciplinas*/
        for(int i=0;i<lista.size();i++) 
            cadeia.add(criaArvore(lista.get(i).toString()));

        /*Ordena lista segundo altura maior numero em primeiro*/
        for(int i=1;i<cadeia.size();i++) {
            for(int j=0;j<cadeia.size()-1;j++) {
                if(cadeia.get(j).getHeight()<cadeia.get(j+1).getHeight()){
                   cadeia.add(j+2,cadeia.get(j));
                   cadeia.remove(j);
                }
            }
        } 

        int alturaMaxima = cadeia.get(0).getNSemestres();
        
        /**/
        for(CadeiaTO c : cadeia){
            if(c.getNSemestres()==alturaMaxima)
                cadeiasCriticas.add(c);
        }
        
        return cadeiasCriticas;
    }
}
